package com.cll.netty.netty.dubborpc.netty;

import java.util.concurrent.Callable;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {

    private ChannelHandlerContext context; // 上下文
    private String result;// 返回的结果
    private String para;// 客户端调用方法时，传入的参数

    // 与服务器连接创建后，就会被调用(1)
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("1 client channelActive 被调用--");
        context = ctx;
    }

    // 收到服务器的数据后，调用方法(4)
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("4 client channelRead 被调用--");
        result = msg.toString();
        notify();
        System.out.println("4.1 client channelRead 被调用--");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    // 被代理对象调用，发送数据给服务器，-> wait -> 等待被唤醒（channelRead）-> 返回结果（3） -> (5)
    @Override
    public synchronized Object call() throws Exception {
        System.out.println("3 client call 被调用--");
        context.writeAndFlush(para);
        System.out.println("3.1 client call 被调用--");
        wait(); // 进行wait, 等待channelRead方法获取到服务器结果后，唤醒
        System.out.println("5 client call 被调用--");
        return result; // 服务方返回的结果
    }
    // (2)
    void setPara(String para){
        System.out.println("2 client setPara 被调用--");
        this.para = para;
    }
}
